home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / CW MacMindy 1.4 / Examples / Toolbox / Toolbox.dyl < prev    next >
Encoding:
Text File  |  1995-11-14  |  26.9 KB  |  796 lines  |  [TEXT/CWIE]

  1. module: Toolbox
  2.  
  3. define module Toolbox
  4.     use Dylan;                            // all programs need this.
  5.     use Extensions;                        // imports "main"
  6.     use Extern;                            // imports "load-object-file", etc.
  7.     
  8.     export
  9.         get-c-function, Debugger, DebugStr,
  10.         
  11.         $nil,
  12.         
  13.         <Ptr>,     NewPtr, DisposePtr, 
  14.         <Handle>, NewHandle, DisposeHandle,
  15.             
  16.         <Pascal-string>,
  17.         
  18.         <OSErr>, <OSType>, os-type,
  19.         
  20.         <Point>, point-v, point-v-setter, point-h, point-h-setter,
  21.         point,
  22.         
  23.         <Rect>, top, top-setter, left, left-setter,
  24.                 bottom, bottom-setter, right, right-setter,
  25.         
  26.         // Resource Manager.
  27.         GetResource, ReleaseResource,
  28.         
  29.         // Sound Manager.
  30.         SysBeep, SndPlay,
  31.                 
  32.         // Event Manager.
  33.         $everyEvent,
  34.         $nullEvent, $mouseDown, $mouseUp, $keyDown, $keyUp, $autoKey, $updateEvt, $diskEvt, $activateEvt,
  35.         $osEvt, $kHighLevelEvent,
  36.         $cmdKey,
  37.         
  38.         <EventRecord>, event-what, event-message, event-when, event-where, event-modifiers,
  39.         GetNextEvent, SystemTask, WaitNextEvent,
  40.         
  41.         // AppleEvents.
  42.         $kCoreEventClass,
  43.         $kAEOpenApplication, $kAEOpenDocuments, $kAEPrintDocuments, $kAEQuitApplication,
  44.         
  45.         <RoutineDescriptor>, <UniversalProcPtr>,
  46.         <AEEventClass>, <AEEventID>, <AppleEvent>,
  47.         <AEEventHandlerUPP>, $uppAEEventHandlerProcInfo,
  48.  
  49.         AEInstallEventHandler, AEProcessAppleEvent,
  50.         
  51.         TickCount, Button, StillDown, WaitMouseUp, GetMouse, GlobalToLocal,
  52.  
  53.         // QuickDraw.
  54.         <BitMap>, bounds, <QDGlobals>, screenBits, qd,
  55.         <RgnHandle>, NewRgn, DisposeRgn, SetEmptyRgn, SetRectRgn, RectRgn,
  56.         
  57.         <GrafPtr>, portRect, SetPort, GetPort,
  58.         MoveTo, LineTo, DrawString, TextFont,
  59.         PenMode, $patOr, $patCopy, $patXor, 
  60.  
  61.         EraseRect, FrameRect, InvertRect, PaintRect,
  62.         PtInRect,
  63.         
  64.         InitCursor, HideCursor, ShowCursor,
  65.         
  66.         // Fonts.
  67.         
  68.         GetFNum,
  69.         
  70.         // Window Manager.
  71.         <WindowPtr>,
  72.         FrontWindow, ShowWindow, HideWindow, SelectWindow, SetWTitle,
  73.         GetNewWindow, DisposeWindow, BeginUpdate, EndUpdate, DrawGrowIcon,
  74.         FindWindow,
  75.         $inDesk, $inMenuBar, $inSysWindow, $inContent, $inDrag, $inGrow, $inGoAway, $inZoomIn, $inZoomOut,
  76.         DragWindow, TrackGoAway, TrackBox, ZoomWindow, GrowWindow, SizeWindow,
  77.         
  78.         // Dialog Manager.
  79.         <DialogPtr>, <ModalFilterUPP>, $uppModalFilterProcInfo,
  80.         Alert,
  81.         
  82.         // Menu Manager.
  83.         <MenuBarHandle>, <MenuHandle>,
  84.         GetNewMBar, SetMenuBar, DrawMenuBar, HiliteMenu,
  85.         MenuSelect, MenuKey,
  86.         GetMenuHandle, CountMItems, GetMenuItemText, EnableItem, DisableItem,
  87.         AppendResMenu,
  88.         
  89.         // Desk Accessories.
  90.         OpenDeskAcc,
  91.         
  92.         // OS Utils.
  93.         GetDateTime, SecondsToDate,
  94.         <DateTimeRec>, year, month, day, hour, minute, seconds, dayOfWeek
  95. end module Toolbox;
  96.  
  97. // This is potentially useful, but will probably be overshadowed by Melange.
  98. // It combines the functionality of "find-c-function" and
  99. // "constrain-c-function" to get usable function in one step.
  100.  
  101. define constant gcf-unbound = pair(#f, #f); // hack
  102.  
  103. define method get-c-function (name :: <string>, #key args, rest = ~args,
  104.                                 result = <object>, file = gcf-unbound)
  105.  => (result :: <c-function>);
  106.   let real-args = if (args) as(<list>, args) else #() end if;
  107.   let real-result = if (instance?(result, <sequence>)) as(<list>, result)
  108.             else list(result)
  109.             end if;
  110.   let fun = if (file == gcf-unbound)
  111.           find-c-function(name)
  112.         else
  113.           find-c-function(name, file: file);
  114.         end if;
  115.   fun & constrain-c-function(fun, real-args, rest, real-result);
  116. end method get-c-function;
  117.  
  118. define constant *InterfaceLib* = load-object-file(#("InterfaceLib"));
  119.  
  120. // Low-Level Debugger.
  121.  
  122. define constant Debugger = get-c-function("Debugger", args: #(),
  123.                                             result: #(), file: *InterfaceLib*);
  124. define constant DebugStr = get-c-function("DebugStr", args: list(<Pascal-string>),
  125.                                             result: #(), file: *InterfaceLib*);
  126.  
  127. // Memory Manager.
  128.  
  129. define constant $nil = as(<statically-typed-pointer>, 0);
  130.  
  131. // <Ptr>
  132.  
  133. define class <Ptr> (<statically-typed-pointer>) end class;
  134.  
  135. define constant NewPtr = get-c-function("NewPtr", args: list(<integer>),
  136.                                             result: <Ptr>, file: *InterfaceLib*);
  137. define constant DisposePtr = get-c-function("DisposePtr", args: list(<Ptr>),
  138.                                             result: #(), file: *InterfaceLib*);
  139.  
  140. define method destroy (pointer :: <Ptr>) => ();
  141.   DisposePtr(pointer);
  142. end method destroy;
  143.  
  144. define class <Handle> (<statically-typed-pointer>) end class;
  145.  
  146. define constant NewHandle = get-c-function("NewHandle", args: list(<integer>),
  147.                                             result: <Handle>, file: *InterfaceLib*);
  148. define constant DisposeHandle = get-c-function("DisposeHandle", args: list(<Handle>),
  149.                                             result: #(), file: *InterfaceLib*);
  150.  
  151. define method destroy (handle :: <Handle>) => ();
  152.   DisposeHandle(handle);
  153. end method destroy;
  154.  
  155. // Pascal Strings.
  156.  
  157. define class <Pascal-string> (<string>, <Ptr>) 
  158. end class <Pascal-string>;
  159.  
  160. define method as (cls == <Pascal-string>, str :: <Pascal-string>) => (result :: <Pascal-string>);
  161.   str;
  162. end method as;
  163.  
  164. define method make(cls :: limited(<class>, subclass-of: <Pascal-string>),
  165.                            #key size: sz = 0, fill = ' ')
  166.   let result = as(cls, NewPtr(256));
  167.   let fill-byte = as(<integer>, fill);
  168.   for (i from 1 to sz)
  169.     unsigned-byte-at(result, offset: i) := fill-byte;
  170.   end for;
  171.   unsigned-byte-at(result, offset: 0) := sz;
  172.   result;
  173. end method make;
  174.  
  175. define method forward-iteration-protocol(str :: <Pascal-string>)
  176.   values(0, #f,
  177.      method (str, state) state + 1 end method,
  178.      method (str, state, limit)
  179.        limit >= unsigned-byte-at(str);
  180.      end method,
  181.      method (str, state) state end method,
  182.      method (str, state)
  183.        as(<character>, unsigned-byte-at(str, offset: state + 1));
  184.      end method,
  185.      method (value :: <character>, str, state)
  186.        unsigned-byte-at(str, offset: state + 1) := as(<integer>, value);
  187.      end method,
  188.      method (str, state) state end method);
  189. end method forward-iteration-protocol;
  190.  
  191. /*
  192. define method \< (str1 :: <Pascal-string>, str2 :: <Pascal-string>)
  193.  => result :: <object>;
  194.   for (c1 in str1, c2 in str2, while c1 < c2)
  195.   finally
  196.     #t;
  197.   end for;
  198. end method \<;
  199. */
  200.  
  201. define method size (string :: <Pascal-string>) => result :: <integer>;
  202.     unsigned-byte-at(string, offset: 0);
  203. end method size;
  204.  
  205. define method size-setter (new-size :: <integer>, string :: <Pascal-string>)
  206.     unsigned-byte-at(string, offset: 0) := new-size;
  207. end method size-setter;
  208.  
  209. define method element (string :: <Pascal-string>, index :: <integer>, #key default: def) => <character>;
  210.   as(<character>, unsigned-byte-at(string, offset: index + 1));
  211. end method element;
  212.  
  213. define method element-setter (value :: <character>, string :: <Pascal-string>, index :: <integer>)
  214.   unsigned-byte-at(string, offset: index + 1) := as(<integer>, value);
  215. end method element-setter;
  216.  
  217. // This is a very common operation, so let's make it fast.
  218.  
  219. define method as (cls == <Pascal-string>, str :: <byte-string>)
  220.   let sz = str.size;
  221.   let result = as(<Pascal-string>, NewPtr(256));
  222.   for (i from 1 to sz)
  223.     unsigned-byte-at(result, offset: i) := as(<integer>, str[i - 1]);
  224.   end for;
  225.   unsigned-byte-at(result, offset: 0) := sz;
  226.   result;
  227. end method as;
  228.  
  229. // This is a very common operation, so let's make it fast.
  230. //
  231. define method as (cls == <byte-string>, str :: <Pascal-string>)
  232.   let sz = str.size;
  233.   let result = make(<string>, size: sz);
  234.   for (i from 0 below sz)
  235.     result[i] := as(<character>, unsigned-byte-at(str, offset: i + 1));
  236.   end for;
  237.   result;
  238. end method as;
  239.  
  240. // OSErr.
  241.  
  242. define constant <OSErr> = <integer>;
  243.  
  244. // OSType.
  245.  
  246. define constant <OSType> = <extended-integer>;
  247.  
  248. define constant os-type = method (typestr :: <string>) => (result :: <OSType>);
  249.     let type = as(<OSType>, as(<integer>, typestr[0]));
  250.     for (i from 1 below 4)
  251.         type := type * 256 + as(<integer>, typestr[i]);
  252.     finally
  253.         type;
  254.     end for;
  255. end method;
  256.  
  257. // Points.
  258.  
  259. define class <Point> (<Ptr>) end class;
  260.  
  261. define method point-v (pt :: <Point>) => (v :: <integer>);
  262.     signed-short-at(pt, offset: 0);
  263. end method point-v;
  264.  
  265. define method point-v-setter (value :: <integer>, pt :: <Point>) => (value :: <integer>);
  266.     signed-short-at(pt, offset: 0) := value;
  267. end method point-v-setter;
  268.  
  269. define method point-h (pt :: <Point>) => (h :: <integer>);
  270.     signed-short-at(pt, offset: 2);
  271. end method point-h;
  272.  
  273. define method point-h-setter (value :: <integer>, pt :: <Point>) => (value :: <integer>);
  274.     signed-short-at(pt, offset: 2) := value;
  275. end method point-h-setter;
  276.  
  277. define method point (x :: <integer>, y :: <integer>) => (pt :: <Point>);
  278.     let pt = as (<Point>, NewPtr(4));
  279.     pt.point-v := y;
  280.     pt.point-h := x;
  281.     pt;
  282. end method point;
  283.  
  284. define method as (cls == <integer>, pt :: <Point>) => (result :: <integer>);
  285.     as(<extended-integer>, signed-long-at(pt));
  286. //    as(<integer>, signed-long-at(pt));
  287. end method as;
  288.  
  289. define method make(cls == <Point>, #key v = 0, h = 0)
  290.   let pt = as(<Point>, NewPtr(4));
  291.   point-v(pt) := v;
  292.   point-h(pt) := h;
  293.   pt;
  294. end method make;
  295.  
  296.  
  297. // Rectangles.
  298.  
  299. define class <Rect> (<Ptr>) end class;
  300.  
  301. define method top (rect :: <Rect>) => (top :: <integer>);
  302.     signed-short-at(rect, offset: 0);
  303. end method top;
  304.  
  305. define method top-setter (value :: <integer>, rect :: <Rect>) => (top :: <integer>);
  306.     signed-short-at(rect, offset: 0) := value;
  307. end method top-setter;
  308.  
  309. define method left (rect :: <Rect>) => (left :: <integer>);
  310.     signed-short-at(rect, offset: 2);
  311. end method left;
  312.  
  313. define method left-setter (value :: <integer>, rect :: <Rect>) => (left :: <integer>);
  314.     signed-short-at(rect, offset: 2) := value;
  315. end method left-setter;
  316.  
  317. define method bottom (rect :: <Rect>) => (bottom :: <integer>);
  318.     signed-short-at(rect, offset: 4);
  319. end method bottom;
  320.  
  321. define method bottom-setter (value :: <integer>, rect :: <Rect>) => (bottom :: <integer>);
  322.     signed-short-at(rect, offset: 4) := value;
  323. end method bottom-setter;
  324.  
  325. define method right (rect :: <Rect>) => (right :: <integer>);
  326.     signed-short-at(rect, offset: 6);
  327. end method right;
  328.  
  329. define method right-setter (value :: <integer>, rect :: <Rect>) => (right :: <integer>);
  330.     signed-short-at(rect, offset: 6) := value;
  331. end method right-setter;
  332.  
  333. define method make(cls == <Rect>, #key top: t = 0, left: l = 0,
  334.                         bottom: b = 0, right: r = 0)
  335.   let rect = as(<Rect>, NewPtr(8));
  336.   rect.top := t;
  337.   rect.left := l;
  338.   rect.bottom := b;
  339.   rect.right := r;
  340.   rect;
  341. end method make;
  342.  
  343. // this one's harder to express using Toolbox interface.
  344.  
  345. /*
  346. define constant PtInRect = method (pt :: <Point>, rect :: <Rect>) => (result :: <Boolean>);
  347.     (pt.point-v >= rect.top &
  348.      pt.point-h >= rect.left &
  349.      pt.point-v <= rect.bottom &
  350.      pt.point-h <= rect.right);
  351. end method;
  352. */
  353.  
  354. define constant PtInRect = 
  355. begin
  356.     let func = get-c-function("PtInRect", args: list(<integer>, <Rect>),
  357.                                             result: <boolean>, file: *InterfaceLib*);
  358.     method (pt :: <Point>, rect :: <Rect>) => (result :: <boolean>);
  359.         func(as(<integer>, pt), rect);
  360.     end method;
  361. end;
  362.  
  363. // Resource Manager.
  364.  
  365. define constant GetResource = get-c-function("GetResource", args: list(<OSType>, <integer>),
  366.                                             result: <Handle>, file: *InterfaceLib*);
  367. define constant ReleaseResource = get-c-function("ReleaseResource", args: list(<Handle>),
  368.                                             result: #(), file: *InterfaceLib*);
  369.  
  370. // Sound Manager.
  371.  
  372. define constant SysBeep = get-c-function("SysBeep", args: list(<integer>),
  373.                                             result: #(), file: *InterfaceLib*);
  374.  
  375. define class <SndChannel> (<Ptr>) end class;
  376.  
  377. define constant SndPlay = get-c-function("SndPlay", args: list(<SndChannel>, <Handle>, <boolean>),
  378.                                             result: <OSErr>, file: *InterfaceLib*);
  379.  
  380. // Event Manager.
  381.                                             
  382. define constant $everyEvent = -1;
  383.  
  384. // event codes.
  385. define constant $nullEvent = 0;
  386. define constant $mouseDown = 1;
  387. define constant $mouseUp = 2;
  388. define constant $keyDown = 3;
  389. define constant $keyUp = 4;
  390. define constant $autoKey = 5;
  391. define constant $updateEvt = 6;
  392. define constant $diskEvt = 7;
  393. define constant $activateEvt = 8;
  394. define constant $osEvt = 15;
  395. define constant $kHighLevelEvent = 23;
  396.  
  397. // modifier masks.
  398. define constant $cmdKey = 256;
  399.  
  400. define class <EventRecord> (<Ptr>) end class;
  401.  
  402. define method make(cls == <EventRecord>, #key what: what)
  403.     as(<EventRecord>, NewPtr(16));
  404. end method make;
  405.  
  406. define method event-what (event :: <EventRecord>) => (what :: <integer>);
  407.     signed-short-at(event, offset: 0);
  408. end method event-what;
  409.  
  410. define method event-message (event :: <EventRecord>) => (message :: <integer>);
  411.     unsigned-long-at(event, offset: 2);
  412. end method event-message;
  413.  
  414. define method event-when (event :: <EventRecord>) => (when :: <integer>);
  415.     unsigned-long-at(event, offset: 6);
  416. end method event-when;
  417.  
  418. define method event-where (event :: <EventRecord>) => (where :: <Point>);
  419.     as (<Point>, event + 10);
  420. end method event-where;
  421.  
  422. define method event-modifiers (event :: <EventRecord>) => (modifiers :: <integer>);
  423.     signed-short-at(event, offset: 14);
  424. end method event-modifiers;
  425.  
  426. define constant GetNextEvent = get-c-function("GetNextEvent", args: list(<integer>, <EventRecord>),
  427.                                             result: <boolean>, file: *InterfaceLib*);
  428. define constant SystemTask = get-c-function("SystemTask", args: #(),
  429.                                             result: #(), file: *InterfaceLib*);
  430. define constant WaitNextEvent = get-c-function("WaitNextEvent", args: list(<integer>, <EventRecord>, <integer>, <RgnHandle>),
  431.                                             result: <boolean>, file: *InterfaceLib*);
  432.  
  433. define class <RoutineDescriptor> (<machine-pointer>) end class;
  434. define constant <UniversalProcPtr> = <RoutineDescriptor>;
  435.  
  436. define constant <AEEventClass> = <OSType>;
  437. define constant <AEEventID> = <OSType>;
  438.  
  439. define constant $kCoreEventClass :: <AEEventClass> = os-type("aevt");
  440.  
  441. define constant $kAEOpenApplication :: <AEEventID> = os-type("oapp");
  442. define constant $kAEOpenDocuments :: <AEEventID> = os-type("odoc");
  443. define constant $kAEPrintDocuments :: <AEEventID> = os-type("pdoc");
  444. define constant $kAEQuitApplication :: <AEEventID> = os-type("quit");
  445.  
  446. define class <AppleEvent> (<Ptr>) end class;
  447.  
  448. define constant <AEEventHandlerUPP> = <UniversalProcPtr>;
  449. define constant $uppAEEventHandlerProcInfo = 4064;
  450.  
  451. define constant AEInstallEventHandler = get-c-function("AEInstallEventHandler", args: list(<AEEventClass>, <AEEventID>, <AEEventHandlerUPP>, <integer>, <boolean>),
  452.                                             result: <OSErr>, file: *InterfaceLib*);
  453.  
  454. define constant AEProcessAppleEvent = get-c-function("AEProcessAppleEvent", args: list(<EventRecord>),
  455.                                             result: <OSErr>, file: *InterfaceLib*);
  456.  
  457. define constant TickCount = get-c-function("TickCount", args: #(),
  458.                                             result: <integer>, file: *InterfaceLib*);
  459.  
  460. define constant Button = get-c-function("Button", args: #(),
  461.                                             result: <boolean>, file: *InterfaceLib*);
  462. define constant StillDown = get-c-function("StillDown", args: #(),
  463.                                             result: <boolean>, file: *InterfaceLib*);
  464. define constant WaitMouseUp = get-c-function("WaitMouseUp", args: #(),
  465.                                             result: <boolean>, file: *InterfaceLib*);
  466.  
  467. define constant GetMouse = get-c-function("GetMouse", args: list(<Point>),
  468.                                             result: #(), file: *InterfaceLib*);
  469. define constant GlobalToLocal = get-c-function("GlobalToLocal", args: list(<Point>),
  470.                                             result: #(), file: *InterfaceLib*);
  471.  
  472. // QuickDraw.
  473.  
  474. define class <BitMap> (<statically-typed-pointer>) end class;
  475.  
  476. define method bounds (bitmap :: <BitMap>) => (result :: <Rect>);
  477.     as(<Rect>, bitmap + 6);
  478. end method;
  479.  
  480. define class <QDGlobals> (<statically-typed-pointer>) end class;
  481.  
  482. define method screenBits (qdg :: <QDGlobals>) => (result :: <BitMap>);
  483.     as(<BitMap>, qdg + 80);
  484. end method;
  485.  
  486. define constant qd = as(<QDGlobals>, find-c-pointer("qd"));
  487.  
  488. define class <RgnHandle> (<Handle>) end class;
  489.  
  490. define constant NewRgn = get-c-function("NewRgn", args: #(),
  491.                                             result: <RgnHandle>, file: *InterfaceLib*);
  492. define constant DisposeRgn = get-c-function("DisposeRgn", args: list(<RgnHandle>),
  493.                                             result: #(), file: *InterfaceLib*);
  494. define constant SetEmptyRgn = get-c-function("SetEmptyRgn", args: list(<RgnHandle>),
  495.                                             result: #(), file: *InterfaceLib*);
  496. define constant SetRectRgn = get-c-function("SetRectRgn", args: list(<RgnHandle>, <integer>, <integer>, <integer>),
  497.                                             result: #(), file: *InterfaceLib*);
  498. define constant RectRgn = get-c-function("RectRgn", args: list(<RgnHandle>, <Rect>),
  499.                                             result: #(), file: *InterfaceLib*);
  500.  
  501. define class <GrafPtr> (<Ptr>) end class;
  502.  
  503. define method portRect (port :: <GrafPtr>)
  504.     as(<Rect>, port + 16);
  505. end method;
  506.  
  507. define constant SetPort = get-c-function("SetPort", args: list(<GrafPtr>),
  508.                                             result: #(), file: *InterfaceLib*);
  509. define constant GetPort =
  510. begin
  511.     let func = get-c-function("GetPort", args: list(<Ptr>),
  512.                                 result: #(), file: *InterfaceLib*);
  513.     method() => (port :: <GrafPtr>);
  514.         let port-ptr = stack-alloc(<Ptr>, 4);
  515.         func(port-ptr);
  516.         pointer-at(port-ptr, class: <GrafPtr>);
  517.     end method;
  518. end;
  519.  
  520. define constant MoveTo = get-c-function("MoveTo", args: list(<integer>, <integer>),
  521.                                             result: #(), file: *InterfaceLib*);
  522. define constant LineTo = get-c-function("LineTo", args: list(<integer>, <integer>),
  523.                                             result: #(), file: *InterfaceLib*);
  524. define constant DrawString = get-c-function("DrawString", args: list(<string>),
  525.                                             result: #(), file: *InterfaceLib*);
  526. define constant TextFont = get-c-function("TextFont", args: list(<integer>),
  527.                                             result: #(), file: *InterfaceLib*);
  528.  
  529. define constant PenMode = get-c-function("PenMode", args: list(<integer>),
  530.                                             result: #(), file: *InterfaceLib*);
  531.  
  532. define constant $patCopy = 8;
  533. define constant $patOr = 9;
  534. define constant $patXor = 10;
  535.  
  536. define constant EraseRect = get-c-function("EraseRect", args: list(<Rect>),
  537.                                             result: #(), file: *InterfaceLib*);
  538. define constant FrameRect = get-c-function("FrameRect", args: list(<Rect>),
  539.                                             result: #(), file: *InterfaceLib*);
  540. define constant InvertRect = get-c-function("InvertRect", args: list(<Rect>),
  541.                                             result: #(), file: *InterfaceLib*);
  542. define constant PaintRect = get-c-function("PaintRect", args: list(<Rect>),
  543.                                             result: #(), file: *InterfaceLib*);
  544.  
  545. // Cursors.
  546.                                 
  547. define constant InitCursor = get-c-function("InitCursor", args: #(),
  548.                                             result: #(), file: *InterfaceLib*);
  549. define constant HideCursor = get-c-function("HideCursor", args: #(),
  550.                                             result: #(), file: *InterfaceLib*);
  551. define constant ShowCursor = get-c-function("ShowCursor", args: #(),
  552.                                             result: #(), file: *InterfaceLib*);
  553.  
  554. // Fonts.
  555.  
  556. define constant GetFNum =
  557. begin
  558.     let func = get-c-function("GetFNum", args: list(<Pascal-string>, <Ptr>),
  559.                                 result: #(), file: *InterfaceLib*);
  560.     method(fontName :: <Pascal-string>) => (fontNumber :: <integer>);
  561.         let fontNumPtr = stack-alloc(<Ptr>, 2);    // sizeof(short).
  562.         func(fontName, fontNumPtr);
  563.         signed-short-at(fontNumPtr);
  564.     end method;
  565. end;
  566.  
  567. // Windows.
  568.  
  569. define constant <WindowPtr> = <GrafPtr>;
  570.  
  571. define constant FrontWindow = get-c-function("FrontWindow", args: #(),
  572.                                             result: <WindowPtr>, file: *InterfaceLib*);
  573. define constant ShowWindow = get-c-function("ShowWindow", args: list(<WindowPtr>),
  574.                                             result: #(), file: *InterfaceLib*);
  575. define constant HideWindow = get-c-function("HideWindow", args: list(<WindowPtr>),
  576.                                             result: #(), file: *InterfaceLib*);
  577. define constant SelectWindow = get-c-function("SelectWindow", args: list(<WindowPtr>),
  578.                                             result: #(), file: *InterfaceLib*);
  579. define constant SetWTitle = get-c-function("SetWTitle", args: list(<WindowPtr>, <Pascal-string>),
  580.                                             result: #(), file: *InterfaceLib*);
  581.  
  582. define constant GetNewWindow =
  583. begin
  584.     let func = get-c-function("GetNewWindow", args: list(<integer>, <WindowPtr>, <WindowPtr>),
  585.                                 result: <WindowPtr>, file: *InterfaceLib*);
  586.     method (windowID :: <integer>, #key storage: st = as(<WindowPtr>, 0), behind: bw = as(<WindowPtr>, -1))
  587.         func(windowID, st, bw);
  588.     end method;
  589. end;
  590. define constant DisposeWindow = get-c-function("DisposeWindow", args: list(<WindowPtr>),
  591.                                             result: #(), file: *InterfaceLib*);
  592.  
  593. define constant BeginUpdate = get-c-function("BeginUpdate", args: list(<WindowPtr>),
  594.                                             result: #(), file: *InterfaceLib*);
  595. define constant EndUpdate = get-c-function("EndUpdate", args: list(<WindowPtr>),
  596.                                             result: #(), file: *InterfaceLib*);
  597. define constant DrawGrowIcon = get-c-function("DrawGrowIcon", args: list(<WindowPtr>),
  598.                                             result: #(), file: *InterfaceLib*);
  599.  
  600. define constant FindWindow =
  601. begin
  602.     let func = get-c-function("FindWindow", args: list(<integer>, <Ptr>),
  603.                                 result: <integer>, file: *InterfaceLib*);
  604.     method (pt :: <Point>) => (partCode :: <integer>, window :: <WindowPtr>);
  605.         let whichWindow = stack-alloc(<Ptr>, 4);    // sizeof(WindowPtr)
  606.         let partCode = func(as(<integer>, pt), whichWindow);
  607.         values(partCode, as(<WindowPtr>, pointer-at(whichWindow)));
  608.     end method;
  609. end;
  610.  
  611. define constant $inDesk = 0;
  612. define constant $inMenuBar = 1;
  613. define constant $inSysWindow = 2;
  614. define constant $inContent = 3;
  615. define constant $inDrag = 4;
  616. define constant $inGrow = 5;
  617. define constant $inGoAway = 6;
  618. define constant $inZoomIn = 7;
  619. define constant $inZoomOut = 8;
  620.  
  621. define constant DragWindow =
  622. begin
  623.     let func = get-c-function("DragWindow", args: list(<WindowPtr>, <integer>, <Rect>),
  624.                                 result: #(), file: *InterfaceLib*);
  625.     method (window :: <WindowPtr>, clickPt :: <Point>, #key bounds: bnds :: <Rect> = qd.screenBits.bounds) => ();
  626.         func(window, as(<integer>, clickPt), bnds);
  627.     end method;
  628. end;
  629.  
  630. define constant TrackGoAway =
  631. begin
  632.     let func = get-c-function("TrackGoAway", args: list(<WindowPtr>, <integer>),
  633.                                 result: <boolean>, file: *InterfaceLib*);
  634.     method (window :: <WindowPtr>, clickPt :: <Point>) => (result :: <boolean>);
  635.         func(window, as(<integer>, clickPt));
  636.     end method;
  637. end;
  638.  
  639. define constant TrackBox =
  640. begin
  641.     let func = get-c-function("TrackBox", args: list(<WindowPtr>, <integer>, <integer>),
  642.                                 result: <boolean>, file: *InterfaceLib*);
  643.     method (window :: <WindowPtr>, clickPt :: <Point>, partCode :: <integer>) => (result :: <boolean>);
  644.         func(window, as(<integer>, clickPt), partCode);
  645.     end method;
  646. end;
  647.  
  648. define constant ZoomWindow = get-c-function("ZoomWindow", args: list(<WindowPtr>, <integer>, <boolean>),
  649.                                             result: #(), file: *InterfaceLib*);
  650.  
  651. define constant GrowWindow =
  652. begin
  653.     let func = get-c-function("GrowWindow", args: list(<WindowPtr>, <integer>, <Rect>),
  654.                                 result: <integer>, file: *InterfaceLib*);
  655.     method (window :: <WindowPtr>, clickPt :: <Point>, sizeRect :: <Rect>)
  656.       => (height :: <integer>, width :: <integer>);
  657.         let result = func(window, as(<integer>, clickPt), sizeRect);
  658.         floor/(result, 65536);    // split up the upper and lower halves of the result.
  659.     end method;
  660. end;
  661.  
  662. define constant SizeWindow = get-c-function("SizeWindow", args: list(<WindowPtr>, <integer>, <integer>, <boolean>),
  663.                                             result: #(), file: *InterfaceLib*);
  664.  
  665. // Dialogs.
  666.  
  667. define constant <DialogPtr> = <GrafPtr>;
  668. define constant <ModalFilterUPP> = <UniversalProcPtr>;
  669. define constant $uppModalFilterProcInfo = 4048;
  670.  
  671. define constant Alert =
  672. begin
  673.     let func = get-c-function("Alert", args: list(<integer>, <ModalFilterUPP>),
  674.                                 result: <integer>, file: *InterfaceLib*);
  675.     method (id :: <integer>, #key filter: flt = #f)
  676.         if (~flt)
  677.             flt := as(<ModalFilterUPP>, 0);
  678.         end if;
  679.         func(id, flt);
  680.     end method;
  681. end;
  682.  
  683. // Menu Manager.
  684.  
  685. define class <MenuBarHandle> (<Handle>) end class;
  686. define class <MenuHandle> (<Handle>) end class;
  687.  
  688. define constant GetNewMBar = get-c-function("GetNewMBar", args: list(<integer>),
  689.                                             result: <MenuBarHandle>, file: *InterfaceLib*);
  690. define constant SetMenuBar = get-c-function("SetMenuBar", args: list(<MenuBarHandle>),
  691.                                             result: #(), file: *InterfaceLib*);
  692. define constant DrawMenuBar = get-c-function("DrawMenuBar", args: #(),
  693.                                             result: #(), file: *InterfaceLib*);
  694. define constant HiliteMenu = get-c-function("HiliteMenu", args: list(<integer>),
  695.                                             result: #(), file: *InterfaceLib*);
  696.  
  697. // Note:  the following use <extended-integer> because all 32-bits of the result are significant.
  698.  
  699. define constant MenuSelect =
  700. begin
  701.     let func = get-c-function("MenuSelect", args: list(<integer>),
  702.                                             result: <extended-integer>, file: *InterfaceLib*);
  703.     method (clickPt :: <Point>) => (menu :: <integer>, item :: <integer>);
  704.         let result = func(as(<integer>, clickPt));
  705.         floor/(result, 65536);
  706. //        let (menu, item) = floor/(result, 65536);
  707. //        values(menu, item);
  708. //        values(as(<fixed-integer>, menu), as(<fixed-integer>, item));
  709.     end method;
  710. end;
  711.  
  712. define constant MenuKey =
  713. begin
  714.     let func = get-c-function("MenuKey", args: list(<integer>),
  715.                                             result: list(<extended-integer>), file: *InterfaceLib*);
  716.     method (ch :: <character>) => (menu :: <integer>, item :: <integer>);
  717.         let result = func(as(<integer>, ch));
  718.         floor/(result, 65536);
  719. //        let (menu, item) = floor/(result, 65536);
  720. //        values(menu, item);
  721. //        values(as(<fixed-integer>, menu), as(<fixed-integer>, item));
  722.     end method;
  723. end;
  724.  
  725. define constant GetMenuHandle = get-c-function("GetMenuHandle", args: list(<integer>),
  726.                                             result: <MenuHandle>, file: *InterfaceLib*);
  727. define constant CountMItems = get-c-function("CountMItems", args: list(<MenuHandle>),
  728.                                             result: <integer>, file: *InterfaceLib*);
  729. define constant GetMenuItemText = get-c-function("GetMenuItemText",
  730.                                             args: list(<MenuHandle>, <integer>, <Pascal-string>),
  731.                                             result: <integer>, file: *InterfaceLib*);
  732. define constant EnableItem = get-c-function("EnableItem", args: list(<MenuHandle>, <integer>),
  733.                                             result: #(), file: *InterfaceLib*);
  734. define constant DisableItem = get-c-function("DisableItem", args: list(<MenuHandle>, <integer>),
  735.                                             result: #(), file: *InterfaceLib*);
  736.  
  737. // adding resource types to menus.
  738.  
  739. define constant AppendResMenu = get-c-function("AppendResMenu", args: list(<MenuHandle>, <OSType>),
  740.                                             result: #(), file: *InterfaceLib*);
  741.  
  742. // Desk Accessory Support.
  743.  
  744. define constant OpenDeskAcc = get-c-function("OpenDeskAcc",
  745.                                             args: list(<Pascal-string>),
  746.                                             result: <integer>, file: *InterfaceLib*);
  747.  
  748. // OSUtils.
  749.  
  750. define class <DateTimeRec> (<Ptr>) end class;
  751.  
  752. define method year (dateTime :: <DateTimeRec>) => (result :: <integer>);
  753.     signed-short-at(dateTime, offset: 0);
  754. end method year;
  755.  
  756. define method month (dateTime :: <DateTimeRec>) => (result :: <integer>);
  757.     signed-short-at(dateTime, offset: 2);
  758. end method month;
  759.  
  760. define method day (dateTime :: <DateTimeRec>) => (result :: <integer>);
  761.     signed-short-at(dateTime, offset: 4);
  762. end method day;
  763.  
  764. define method hour (dateTime :: <DateTimeRec>) => (result :: <integer>);
  765.     signed-short-at(dateTime, offset: 6);
  766. end method hour;
  767.  
  768. define method minute (dateTime :: <DateTimeRec>) => (result :: <integer>);
  769.     signed-short-at(dateTime, offset: 8);
  770. end method minute;
  771.  
  772. define method seconds (dateTime :: <DateTimeRec>) => (result :: <integer>);
  773.     signed-short-at(dateTime, offset: 10);
  774. end method seconds;
  775.  
  776. define method dayOfWeek (dateTime :: <DateTimeRec>) => (result :: <integer>);
  777.     signed-short-at(dateTime, offset: 12);
  778. end method dayOfWeek;
  779.  
  780. define constant GetDateTime =
  781. begin
  782.     let func = get-c-function("GetDateTime", args: list(<Ptr>),
  783.                                             result: #(), file: *InterfaceLib*);
  784.     method () => (time :: <integer>);
  785.         let longPtr = stack-alloc(<Ptr>, 4);
  786.         func(longPtr);
  787.         // build the result as an <extended-integer> since it's a large unsigned number.
  788.         // let time = as(<extended-integer>, unsigned-short-at(longPtr));
  789.         // time * 65536 + as(<extended-integer>, unsigned-short-at(longPtr, offset: 2));
  790.         unsigned-long-at(longPtr);    // newer runtime promotes to <extended-integer> as needed.
  791.     end method;
  792. end;
  793.  
  794. define constant SecondsToDate = get-c-function("SecondsToDate", args: list(<extended-integer>, <DateTimeRec>),
  795.                                             result: #(), file: *InterfaceLib*);
  796.